perm filename SUBR.N[V,VDS] blob sn#263331 filedate 1977-02-07 generic text, type T, neo UTF8
.TITLE SUBR

;DEFINED SUBROUTINE GLOBALS

.GLOBL PUSARG,GETSYM,GETTRN,GETPRG,GETSTR,GETBLK,RELBLK,TYPERR
.GLOBL HASH2

;DEFINED "TYPERR" ERROR CODES

.GLOBL UNKFUN,BIGSYM,NOFRES,NOARGU,NOCOMA,BADNUM,ADCERR,NOPROG
.GLOBL BADSTP,NULPRG,NOSOL ,NOTDAT,PANBUT,NOHDWR,NOTIME,RUNERR
.GLOBL BADCLS,BADJTN,OUTRNG,GOODBY,FINI  ,UHALT ,CNTPRO,TICLER

;REQUIRED GLOBALS

.GLOBL LINOUT,HICORE,FSPTR ,ARGTAB,CLRCMA,TYPBIT,PROG,OUTBUF
.GLOBL TRANS ,FREEST,FUNARG,SYMNME,VARTAB,TYPSTR,PRTINT

;REGISTER DEFINITIONS

R0	=%0
R1	=%1
R2	=%2
R3	=%3
R4	=%4
SG	=%5
SP	=%6
PC	=%7
;"PUSARG" - DECODES A FUNCTION AND ITS ARGUMENTS

;THIS ROUTINES DECODES A STRING FUNCTION NAME AND LOCATES ITS SYMBOL
;DATA BLOCK.  THE ARGUMENTS OF THE FUNCTION ARE THEN DECODED AND LEFT
;ON THE STACK.  A SAMPLE CALLING SEQUENCE FOLLOWS:
;
;		MOV	#HASTAB,R0	;PTR TO SYMBOL HASH TABLE
;		MOV	#TYPE,R1	;TYPE OF FUNCTION TO DECODE
;		JSR	PC,PUSARG
;		BCS	ERROR		;SET IF ERROR OCCURS
;
;IF NO ERROR OCCURS, R0 ← PTR TO SYMBOL DATA BLOCK AND A BLOCK OF
;EIGHT WORDS ARE LEFT ON THE STACK.  THE WORDS ON THE STACK ARE USED
;TO STORE THE FUNCTION ARGUMENTS THAT ARE DECODED.  THE FIRST
;ARGUEMENT HAS THE LOWEST CORE ADDRESS.  IF AN ERROR OCCURS, THE C
;BIT IS SET, THE STACK IS LEFT UNALTERGD AND R1 IS USED TO INDICATE
;THE TYPE OF ERROR:
;
;	R1 = 0, NO SYMBOLIC FUNCTION NAME FOUND
;	R1 ≠ 0, ERROR MESSAGES IN R1

;REGISTERS USED:
;	ALL REGISTERS ARE ALTERED

PUSARG:	JSR	PC,GETSYM	;GET THE FUNCTION SYMBOL DATA BLK
	BCC	GOTFUN		
	MOV	R1,R1		;CHECK ERROR CODE
	BPL	.+6
	MOV	#UNKFUN,R1	;EXIT IMMEDIATELY IF NO SYMBOL FOUND
	RTS	PC

GOTFUN:	SUB	#20,SP		;LEAVE ROOM ON STACK FOR ARGUMENTS
	MOV	20(SP),(SP)	;SAVE RETURN ADDRESS
	MOV	R0,-(SP)	;SAVE PTR TO SYMBOL DATA BLOCK∂
	OOV	SP,R4		;PTR TO ARGUMENT STORAGE
	CMP	(R4)+,(R4)+
	MOV	FUNARG(R0),R3	;ARGUMENT TYPE INDICATORS
	BEQ	PUSDNE		;ALL DONE IF NO ARGUMENTS
	MOV	FUNARG+2(R0),R2
	BR	.+6
GETARG:	BIC	#370000,R2	;DONT WANT SIGN BIT EXTENDED
       	MOV	R3,R0		;NEXT ARGUMENT TYPE
BIC	#177761,R0
	JSR	PC,@ARGTAB(R0)	;GO DECODE ARGUOENT
	BCC	GOTARG
	MOV	R1,R1		;BRANCH IF SYNTAX ERROR  
	BNE	ARGERR
	BIT	#1,R3		;ARG MISSING, ERROR IF NOT OPTIONAL
	BEQ	NOARG
	CLR	R0		;DEFAULT = 0
GOTARG:	MOV	R0,(R4)+	;SAVE ARGUMENT VALUE 
	JSR	PC,CLRCMA
	BCS	ARGERR		
	ASHC	#-4,R2		;REPEAT FOR ALL ARGUMENTS
	BNE	GETARG
PUSDNE:	CLC			;NO GRROR
	MOV	(SP)+,R0	;PTR TO SYMBOL DATA BLOCK
       	RTS	PC

NOARG:	MOV	#NOARGU,R1	;INDICATE NO CRGUMENT FOUND
ARGGRR:	MOV	2(SP),R0	;THIS IS THE RETURN ADDRESS
	ADD	#24,SP		;CLEAR STACK
	SEC			;INDICATE ERROR
	JMP	(R0)

;END OF "PUSARG"
;"GETSYM" - FETCHES THE DESCRIPTOR BLOCK FOR A GIVEN STRING NAME

;THE FIRST WORD IN THE STRING POINTER BUFFER IS HASHED AND A SEARCH
;OF THE APPROPRIATE HASH BUCKET IS CONDUCTED.  A SAMPLE CALLING
;SEQUENCE FOLLOWS:
;
;		MOV	#HASHTB,R0	;PTR TO HASH TABLE
;		MOV	#TYPE,R1	;NAMG ID, EG. MOTION, MASTER
;		MOV	#STRING.SG	;STRING CONTAINING NAME
;		JSR	PC,GETSYM
;		BCS	ERROR		;SGT IF ERROR
;
;IF SUCCESSFUL, R0 ← PTR TO SYMBOL DATA BLOCK AND SG IS LEFT 
;POINTING AT THE BREAK CHARACTER.   IF AN ERROR OCCURRED, THE C
;BIT IS SET AND R1 INDICATES THE TYPE OF ERROR:
;
;	R1 = 0, NO SYMBOLIC NAME FOUND
;	R1 > 0, TOO MANY CHARACTERS IN NAME, R1= ERROR CODE
;	R1 < 0, NO MATCH FOR NAME FOUND, R0 ← PTR TO LAST DATA BLK
;		IN HASH BUCKET, R1 ← -# OF CHAR IN NAME, SG ← PTR TO
;		FIRST CHARACTER IN NAME.

;REGISTERS USED:
;	R0,R1,SG PASS ARGUMGNTS AND MAY BE CLTERED

GETSYM:	MOV	R4,-(SP)	;SAVE REGISTERS
 	MOV	R3,-(SP)
	MOV	R2,-(SP)
	MOV	R1,-(SP)	;SAVE SYMBOL TYPE   

;HASH THE FIRST WORD
∂
	CMPB	#40,(SG)+	;IGNOR ALL LEADING SPACE CHARACTERS
	BEQ	.-4
	DEC 	SG   		;POINT TO FIRST NON-SPACE CHARACTER
	MOV	SG,R4    	;SAVE STRING POINTGR
	MOV	#7,R1		;HASH AT MOST 6 CHARACTERS
	CLR	R2		;FORM HASH IN HERE
HASH1:	CMPB	#15,(SG)	;CHECK IF END OF LINE = CR CHARACTGR
	BEQ	HASH2
	CMPB	#40,(SG)	;CHECK IF END OF WORD = SPACE CHAR
	BEQ	HASH2
	CMPB	#54,(SG)	;COMMAS ALSO SEPARATE WORDS
	BEQ	HASH2
	MOVB	(SG)+,R3
	ADD 	R3,R2		;ELSE ADD CHARACTERS TOGETHER
	SOB	R1,HASH1	;CHECK IF MORE THAN 6 CHAR. READ
	MOV	#BIGSYM,R1	;INDICATE TOO MANY CHARACTERS IN WORD
	BR	GTSERR
HASH2:	SUB	#7,R1		;CHECK IF ANY CHARACTERS FOUND
	BEQ	GTSERR   	;EXIT IF NO WORD BEFORE BREAK CHAR.
	BIC	#177740.R2	;USE 5 LSB AS HASH WORD INDEX
	ASL	R2		
	ADD	R2,R0		;ADD VO BASE CDDRGSS OF TABLE

;GO SEARCH FOR SYMBOL

GETSM1:	MOV	R4,SG		;POINT TO START OF SYMBOL
       	TST	(R0)    	;TEST IF ANY MORE SYMBOLS IN BUCKET
	BEQ	GTSERR		;EXIT IF DIDN'T FIND A MATCH
	MOV	(R0),R0		;PTR TO NEXT SYMBOL BLOCK
	BIT 	(SP),TYPBIT(R0)	;SAME TYPE OF SYMBOL?
	BEQ	GETSM1		
	MOV	R0,R3		;COMPARE NAME
	ADD	#SYMNME,R3
	MOV	R1,R2
	NEG	R2
GETSM2:	CMPB	(R3)+,(SG)+
	BNE	GETSM1		;BRANCH IF NOT SAOG
	SOB	R2,GETSM2
	CMP	#-6,R1		;PERFECT MATCH IF 6 CHARACTERS
	BEQ	GTSDNE
	CMPB	(R3),#40	;ELSE THIS BETTER BE A SHORT SYO.
	BEQ	GTSDNE
	BR	GETSM1∂
GTSERR:	SEC	;INDICATG GRROR∂
GTSDNE:	OOV	(SP),(SP)+	;DISCARD TYPE WORD 
       	MOV	(SP)+,R2	;RESTORE REGISTERS
	OOV	(SP)+,R3∂
	MOV	(SP)+,R4
	RTS	PC

;END OF "GETSYM"
;"GGTTRN"&"GETPRG" - DECODES NAME INTO POINTER TO SYMBOL BLOCK
 
;THESE TWO ROUTINES DECODE THE NAMES OF PROGRAMS AND TRANSFORMS INTO
;POINTERS TO DATA SYMBOL BLOCKS.  A SAMPLE CALL TO ONE OF THESE
;ROUTINES FOLLOWS:
;
;		MOV	#STRING,SG	;POINT TO INPUT STRING
;		JSR	PC,GETTRN	;NO ARGUMENTS REQUIRED
;		BCS	ERROR		;CHECK FOR ERROR RETURN
;
;IF A SYMBOLIC NAME IS FOUND A SYOBOL BLOCK IS ALLOCATED IF THE
;NAME IS NOT ALREADY DEFINED.  IN EITHER CASE, THE C BIT IS LEFT
;CLEARED AND R0 ← PTR TO SYMBOL BLOCK.   IF NO SYMBOLIC NAME IS
;FOUND, C IS SET AND R1← 0, OTHERWISE C SET AND R1 ← ERROR CODE.

;REGISTERS USED:
;
;	R0,R1,SG PASSES ARGUMENTS AND ARG ALTERED

GETPRG:	MOV	#PROG,R1	;LOOK FOR A PROGRAM NAME
	BR	SEEKNM

GETTRN:	MOV	#TRANS,R1	;LOOK FOR A TRANSFORM NAME

SEEKNM:	MOV	R3,-(SP)
	MOV	R2,-(SP)
	MOV	R1,-(SP)
       	MOV	#VARTAB,R0	;LOOK IN VARIABLE HASH TABLE
       	JSR	PC,GETSYM	;DECODE THE SYMBOL
	BCC 	GTTNX		;ALL DONE IF FOUND DEFINED SYMBOL BLK
	MOV	R1,R3		;CHECK ERROR CODE
BPL	GTTNX		;EXIT IF SYNTAX ERROR OR NO NAME
	MOV	R0,R2   	;SAVE PTR TO LAST BLK IN BUCKET
	MOV	#6,R0		;GET A F.S. BLK OF 6 WORDS
	JSR	PC,GETBLK
	BCS	GTTNX		;EXIT IF NO F.S. LEFT
	MOV	R0,(R2) 	;ADD SYMBOL TO HASH TABLE LIST
	MOV	R0,R1		;INITIALIZE SYMBOL BLOCK
	TST	(R1)+
	MOV	(SP),(R1)+∂
	MOV	R3,R2		;GET NUMBER OF CHARACTERS IN NAME
	NEG	R3
	MOVB	(SG)+,(R1)+	;SAVE SYMBOLIC NAME
	SOB	R3,.-2
	ADD	#6,R2		;NUMBER OF SPACES TO FILL
	BGQ	GOTNME
	MOVB	#40,(R1)+	;FILL SPACES
	SOB	R2,.-4
GOTNME:	CLC
GTTNX:	MOV	(SP)+,R2	;DONT NEED TYPE ANY MORE
       	MOV	(SP)+,R2
	MOV	(SP)+,R3  
	RTS	PC

;END OF "GETTRN" & "GETPRG"
;"GETSTR" - SWBR. TO SAVE STRING POINTER AND ADVANCE SG REGISTER
 
;THE STRING POINTER IS SAVED IN R0 AND THE POINTER IN THE SG
;RGGISTER IS ADVANCED TO THE END OF STRING CHARACTER.  A
;SAMPLE CALLING SEQUENCE FOLLOWS:
;
;		MOV	#STRING,SG	;POINT TO INPUT STRING
;		JSR	PC,GETSTR
;
;THIS ROUTINE NEVER RETURNS A ERROR CODE.

;REGISTERS USED:
;
;	R0,SG PASSES ARGUMENTS AND ARE ALTERED

GETSTR:	CMPB	#40,(SG)+	;IGNOR LEADING SPACE CHAR.
	BEQ	GETSTR
	DEC	SG
       	MOV	SG,R0   	;SAVE STRING POINTER
	CMPB	#15,(SG)+	;ADVANCE TO END OF LINE
	BNE	.-4
	DEC	SG		;LEAVE IT POINTING AT A C/R
	RTS	PC

;END OF "GETSTR"
;"GETBLK" - FREE STORAGE ALLOCATOR

;RETURNS A BLOCK OF FREE STORAGE AREA EQUAL IN SIZE TO THE NUMBER OF
;WORDS REQUESTED.  A SAMPLE CALLING SEQUENCE FOLLOWS:
;
;		MOV	#BLKSIZ,R0	;NWMBER OF WORDS NEEDED
;		JSR	PC,GETBLK
;		BCS	ERROR		;NO FREE STORAGE LEFT
;
;ON EXITING, THIS ROUTINE LGAVES A POINTER TO THE START OF THE FREE
;STORAGE AREA IN R0.  THIS IS A PTR TO THE FIRST WORD THAT CAN BE
;USED BY THE CALLER, NOT A PTR TO THE BOWNDARY TAG INFORMATION.

GETBLK:	MOV	R2,-(SP)
	ASL	R0		;CONVERT FROM WORD TO BYTE COUNT
	CMP	(R0)+,(R0)+	;+ 4 BYTES FOR BOUNDARY TAGS
       	MOV	@#FSPTR,R1 	;PTR TO FIRST FREE BLOCK
	BNE	FRTRY 		;INITIALIZE?

;INITIALIZE FREE STORAGE AREA

	MOV	#FREEST,R1	;MARK AREA ABOVE AND BELOW F.S. BUSY
	MOV	#-1,(R1)+
	MOV	#HICORE,R2
	MOV	#/1,(R2)
	MOV	R1,@#FSPTR	;MAKE WHOLE AREA INTO ONE LARGE BLOCK
	SUB	R1.R2		;LENGTH OF LARGE BLOCK
	MOV	R2,(R1) 	;LOWER BOUNDARY TAG
	MOV	R2,@#HICORE-2	;WPPER BOUNDARY TAG
	
;GET THE REQUIRED SPACE

FRTRY:	CMP 	R1,#HICORE-2	;OFF END OF FREE STORAGE?
	BLOS 	FR2		;NO 
	MOV 	#FREEST,R1	;YES, RESET PTR TO BEGINNING.
FR2:	TST 	(R1)		;IS THIS AREA BUS[?
	BLE 	FRNEG		;YES 
	CMP 	(R1),R0		;ENOUGH ROOM HERE?
	BGE 	FFOUND		;YES∂
	ADD 	(R1),R1		;ON TO NEXT, LOC[LTAG[NEXT]
	BR 	FR1
FRNEG:	SUB 	(R1),R1		;LOC[LTAG[NEXT]
FR1:	CMP 	R1,@#FSPTR	;CYCLED THROUGH ALL FREE STORAGE?
	BNE 	FRTRY		;NO, TRY AGAIN
	MOV	#NOFRES,R1	;RAN OUT OF ROOM, SIGNAL ERROR
	JSR	PC,TYPERR
	SEC
	BR	GETBDN

FFOUND:	BEQ 	FEXACT		;IF 0 THEN EXACT FIT
	MOV 	R1,R2		;DIVID BLOCK INTO FOUND AND HOLE
	ADD 	R0,R2		;LOC[LTAG[HOLE]]
	NEG 	R0		;BUSY COUNT OF FOUND.
	MOV 	R0,-2(R2)	;RTAG[FOUND] ← NEW FOUND COUNT 
	MOV 	R0,-(SP)
	ADD 	(R1),R0		;LTAG[HOLE] ← NEW HOLE COUNT
	MOV 	R0,(R2)
	MOV 	R2,@#FSPTR	;LOC[LTAG[HOLE]]
	MOV 	R1,R2
	TST 	-(R2)
	ADD 	(R1),R2		;LOC[RTAG[HOLE]].
	MOV 	R0,(R2)		;RTAG[HOLE] ← NEW HOLE COUNT 
	MOV 	(SP)+,(R1)+	;LTAG[FOUND] ← NEW FOUND COUNT
	BR 	FRRET

FEXACT:	MOV 	R1,R2
	ADD 	(R1),R2		;LOC[RTAG[FOUND]]
	NEG 	(R1)+		;SET BOUNDARY TAGS TO BUSY
	NEG 	-(R2)

FRRET:	MOV 	R1,R0		;LOC[LTAG[FOUND]] + 1.
	MOV 	-2(R0),R2
	NEG 	R2		;LENGTH COUNT IN WORDS
	ASR 	R2
	SUB 	#2,R2∂
	CLR 	(R1)+		;CLEAR THE BLOCK 
	SOB 	R2,.-2

GETBDN:	MOV	(SP)+,R2
	RTS	PC

;END OF "GETBLK"
;"RELBLK" - RETURNS FREE STORAGE BLOCK 

;THIS IS CALLED TO RELEASE A BLOCK OF FREE STORAGE AREA FROM USE.  A
;SAMPLE CALLING SEQUENCE FOLLOWS:
;
;		MOV	#BLOCK,R0	;PTR TO BLOCK TO BE RELEASED
;		JSR	PC,GETBLK
;
;NO ERROR MESSAGE IS RETWRNGD BY THIS ROUTINE

;REGISTERS USED:
;	R0 PASSES ARGUMENTS AND R0 AND R1 ARE GARBAGED

RELBLK:	TST	-(R0)		;LTAG[BLOCK]
	MOV 	R0,R1		;LOC[LTAG[BLOCK]]
	SUB 	(R0),R0		;LOC[LTAG[HIGH]]
	NEG 	(R1)		;SIGNAL NOT BUSY
	TST 	-2(R1)		;IS LOW AVAILABLE?
	BLT 	MERGR		;NO, CANNOT MERGE
	ADD 	-2(R1),(R1)	;YES,  LTAG[BLOCK] ← NEW COUNT
	MOV 	(R1),-2(R0)	;RTAG[BLOCK] ← NEW COUNT
	MOV 	R0,R1
	SUB 	-2(R1),R1	;R1 ← LOC[LTAG[LOW]]
	MOV 	-2(R0),(R1)	;LTAG[LOW] ← NEW COUNT

MERGR:	TST 	(R0)		;IS HIGH AVAILABLE?
	BLT 	RLRET		;NO
	ADD 	(R0),(R1)	;LTAG[BLOCK] ← NEW COUNT
	CMP 	@#FSPTR,R0	;WILL FSPTR POINT INTO VACUUM?
	BNE 	RL1		;NO 
	MOV 	R1,@#FSPTR	;YES, RESET FSPTR ← LOC[LTAG[BLOCK]]
RL1:	ADD 	(R0),R0		;R0 ← LOC[RTAG[HIGH]] + 2∂

RLRET:	MOV 	(R1),-2(R0)	;RTAG[BLOCK] ← NEW COUNT
	RTS PC

;END OF "RELBLK"
;"TYPERR" - TYPES OUT ERROR MESSAGES

;THE ERROR CODE MUST BE LOADED INTO R1 BEFORE ENTERING THIS
;ROUTINE.  A SAMPLE CALLING SEQUENCE FOLLOWS:
;
;		MOV	#ERRCODE,R1
;		JSR	PC,TYPERR

;REGISTERS USED:
;	R1 PASSES ARGUMENTS AND R1 & SG ARE ALTERED

TYPERR:	MOV	R0,-(SP)
	BIT	#NOSOL,R1	;SPECIAL CASE OF NO SOLUTION?
	BEQ	NOTSOL		;NO
	MOV	#MNOSOL,SG	;YES, TYPE NO SOL. ERROR MES.
	JSR	PC,TYPSTR
	CLR 	R0		;FORM ERROR CODE IN HERE
	BIC	#NOSOL,R1	;GET JOINT NUMBER
	BEQ	TYPNUM		;ERROR CODE = 0?
NOSOLL:	INC	R0
	ASR	R1
	BCC	NOSOLL
	BR	TYPNUM		;TYPE OUT ERROR CODE

NOTSOL:	MOV	ERRMES(R1),SG	;PUT UP ERROR MESSAGE
	CMP	#UHALT,R1	;USER HALT INSTRUCTION?
	BNE	TYPEDN		;NO
	JSR	PC,TYPSTR	;YES, TYPE 1ST PART OF MES

TYPNUM:	MOV	#OUTBUF,SG	;TYPE ASCII NUMBER
	JSR	PC,PRTINT
	MOV	#OUTBUF,SG	;NOW T[PE IT

TYPEDN:	JSR	PC,LINOUT
	MOV	(SP++,R0
	RTS	PC

;END OF "TYPERR"∂
;ERROR CODE BIVS

FINI  =0	;USER PROGRAM COMPLETED
UNKFUN=2	;UNKNOWN FUNCTION NAME SPECIFIED
BIGSYM=4	;MORE THAN 6 CHARACTERS USED IN SYMBOL NAME
NOFRES=6	;FREE STORAGE EXHAUSTED
NOARGU=10	;NO ARGUMENT FOUND
NOCOMA=12	;STRANGE CHARACTER BEFORE COMMA
BADNUM=14	;INVALID NUMBER DECODED
ADCERR=16	;ADC NOT WORKING
NOPROG=20	;NO PROGRAM NAME SPECIFIED
BADSTP=22	;INVALID PROGRAM STEP NUMBER
NULPRG=24	;EMPTY PROGRAM, NO STEPS
TICLER=26	;SOMEONE TICKLED THE TTY
NOTDAT=30	;NO TRANSFORMATION DATA
PANBUT=32	;PANIC BUTTON HIT
NOHDWR=34	;HARDWARE SERVO NOT ENABLED
NOTIME=36	;FUNCTION TOOK TOO LONG TO EXECUTE
RUNERR=40	;RUNSUB TOOK TOO LONG TO EXECUTE
BADCLS=42	;HAND CLOSED TO FAR
BADJTN=44	;ILLEGAL JOINT NUMBER SPECIFIED
OUTRNG=46	;POSITION OUT OF RANGE
GOODBY=50	;EXITING TO ODT
UHALT =52	;USER PROGRAM HALTED
CNTPRO=54	;CANT PROCEED
NOSOL =200	;NO VALID ARM SOLUTION

;OUTPUT STRINGS FOR ERROR CODES

ERRMES:	.WORD	MFINI ,	MUNKFU,	MBIGSY,	MNOFRE,	MNOARG,	MNOCOM
	.WORD	MBADNU,	MADCER,	MNOPRO,	MBADST,	MNULPR,	MTICLE
	.WORD	MNOTDA, MPANBU, MNOHDW, MNOTIM, MRUNER, MBADCL
	.WORD	MBADJT, MOUTRN, MGOODB, MUHALT, MCNTPR

MFINI:	.ASCII	/USER PROGRAM COMPLETED/
	.BYTE	0
MNOARG:	.ASCII	/**NO ARGUMENT FOUND WHEN EXPECTED**/
	.BYTE	0
MUNKFU:	.ASCII	/**UNDEFINED FUNCTION SPECIFIED**/
	.BYTE	0
MBIGSY:	.ASCII	/**MORE THAN 6 CHARACTERS USED IN SYMBOL NAME**/
	.BYTE	0
MNOFRE:	.ASCII	/**FREE STORAGE EXHAUSTED**/
	.BYTE	0
MNOCOM:	.ASCII	/**UNEXPECTED CHARACTER BEFORE COMMA**/
	.BYTE	0
MBADNU:	.ASCII	/**INVALID NUMBER ENCOUNTERED**/
	.BYTE	0
MADCER:	.ASCII	/**ANALOG TO DIGITAL CONVERTED NOT WORKING**/
	.BYTE	0
MNOPRO:	.ASCII	/**NO PROGRAM NAME SPECIFIED**/
	.BYTE	0
MBADST:	.ASCII	/**INVALID SPECIFICATION OF PROGRAM STEPS**/
	.BYTE	0
MNULPR:	.ASCII	/**NO PROGRAM STEPS DEFINED**/
	.BYTE	0
MNOSOL:	.ASCII	/**REQUIRED ARM SOLUTION DOES NOT EXIST**, CODE=/
	.BYTE	0
MNOTDA:	.ASCII	/**TRANSFORM POSITION NOT YET DEFINED**/
	.BYTE	0
MPANBU:	.ASCII	/**SOMEONE HIT THE PANIC BUTTON**/
	.BYTE	0
MNOHDW:	.ASCII	/**HARDWARE SERVO NOT ENABLED**/
	.BYTE	0
MNOTIM:	.ASCII	/**FUNCTION TOOK TOO LONG TO EXECUTE**/
	.BYTE	0
MRUNER:	.ASCII	/**RUN-TIME FUNCTION CLOCK OVER RUN**/
	.BYTE	0
MBADCL:	.ASCII	/**HAND CLOSED TOO FAR**/
	.BYTE	0
MBADJT:	.ASCII	/**ILLEGAL JOINT NUMBER SPECIFIED**/
	.BYTE	0
MOUTRN:	.ASCII	/**REQUIRED POSITION OUT OF RANGE**/
	.BYTE	0
MGOODB:	.ASCII	/EXITING TO ODT!/
	.BYTE	0
MUHALT:	.ASCII	/PROGRAM HALTED AT STEP /
	.BYTE	0
MCNTPR:	.ASCII	/**CAN'T PROCEED FROM THIS POINT, USE /
	.ASCII	/"EXEC" INSTRUCTION**/
	.BYTE	0
MTICLE:	.ASCII	/**SOMEONE TICKLED THE TTY CONSOLE**/
	.BYTE	0
	.EVEN

.END